



// ./swh.html  ==>  swh 获取文件名称
export const handleFileName = (str) => {
  return str.replace(/^\.\/(.*)\.\w+$/, "$1")
}
// 写一个四舍五入保留2位小数的方法,如果是整数就不增加小数点
export const roundToTwoDecimals = (num) => {
  // 判断是否为整数，可通过比较num和Math.floor(num)是否相等来判断
  if (num === Math.floor(num)) {
    return num; // 如果是整数，直接返回
  } else {
    // 否则，四舍五入到两位小数
    return parseFloat(num.toFixed(2));
  }
}

// 顶部提示框再次封装     使用 myTips('success', '复制成功~');
export const myTips = (type, text) => {
  Message({
    type: type, //success   error
    content: text,
  });
};
/**
 *鼠标拖动元素 案例查看使用
 * @param {dom} targetEle  需要移动的元素
 * @param {dom} moveInEle  点击执行推拽的元素
 */
export const moveEle = (targetEle, moveInEle) => {
  document.onmousemove = function (e) {
    const eleTop = e.clientY - moveInEle.offsetY;
    const eleLeft = e.clientX - moveInEle.offsetX;
    const noBottom = document.body.offsetHeight - targetEle.offsetHeight; //底部限制
    const noRight = document.body.offsetWidth - targetEle.offsetWidth; //右侧显示
    const topPx = eleTop < 0 ? 0 : eleTop > noBottom ? noBottom : eleTop;
    const leftPx = eleLeft < 0 ? 0 : eleLeft > noRight ? noRight : eleLeft;
    targetEle.style.transform = 'translate(0%)';
    targetEle.style.left = leftPx + 'px';
    targetEle.style.top = topPx + 'px';
  };
  document.onmouseup = function (e) {
    document.onmousemove = null;
    document.onmouseup = null;
  };
};
// 首页图标拖拽返回坐标
export const retrunMoveEle = (targetEle, moveInEle, cb, cbA) => {
  let leftPx
  let topPx
  document.onmousemove = function (e) {
    const eleTop = e.clientY - moveInEle.offsetY;
    const eleLeft = e.clientX - moveInEle.offsetX;
    const noBottom = document.body.offsetHeight - targetEle.offsetHeight - 20; //底部限制  -20是特意计算图标下文字的高度
    const noRight = document.body.offsetWidth - targetEle.offsetWidth; //右侧显示
    topPx = eleTop < 0 ? 0 : eleTop > noBottom ? noBottom : eleTop;
    leftPx = eleLeft < 0 ? 0 : eleLeft > noRight ? noRight : eleLeft;
    targetEle.style.transform = 'translate(0%)';
    targetEle.style.left = leftPx + 'px';
    targetEle.style.top = topPx + 'px';
    cbA(leftPx, topPx)   //移动时回调
  };
  document.onmouseup = function (e) {
    document.onmousemove = null;
    document.onmouseup = null;
    cb(leftPx, topPx)   //抬起鼠标回调
  };
};
/**
 *根据毫秒获取  天时分秒
 * @param {*} mss 毫秒值
 * @returns
 */
export const formatDuring = (mss) => {
  var days = parseInt(mss / (1000 * 60 * 60 * 24));
  var hours = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = (mss % (1000 * 60)) / 1000;
  return (
    days + ' 天 ' + hours + ' 时 ' + minutes + ' 钟 ' + seconds + ' 秒 '
  );
};

// 获取创建日期  2023年05月25日 15:52:45
export const getCreationTime = () => {
  return completionTime(timeFormat(new Date().toLocaleString()))
}
// 字符串指定位置插入字符
function insertStr(str, index, insertStr) {
  return str.substring(0, index) + insertStr + str.substring(index)
}
// 获取时间  2023年05月25日 星期几 15:52:45
export const getCreationTimeAndWeek = () => {
  const weekList = ['日', '一', '二', '三', '四', '五', '六']
  const timeStr = getCreationTime()
  const weekCode = new Date().getDay()
  const week = '星期' + weekList[weekCode] + ' '
  return insertStr(timeStr, 12, week)
}


/**
 * 改变元素尺寸
 * eleL左侧元素
 * eleR右侧元素
 * showBox包含拖拽元素的父级
 * visualW可视宽度
 */
export const changeEleSize = (eleL, eleR, showBox, visualW) => {
  showBox.onmousemove = function (e) {
    if (e.pageX < 100 || e.pageX > visualW - 100) return
    eleL.style.width = `${e.pageX}px`
    eleR.style.width = `${visualW - e.pageX}px`
  };
  showBox.onmouseup = function (e) {
    showBox.onmousemove = null;
    showBox.onmouseup = null;
  };
};

/**
 * 判断两个数组是否相同,数组中*****有对象元素不可使用*****
 * @param {*} stra
 * @param {*} strb
 * @return {Boolean} false不相同  true相同
 */
export const isIdentical = (stra, strb) => {
  //  长度不一致
  if (stra.length !== strb.length) return false
  // 拼接字符串
  let mergeArr = stra.concat(strb);
  // 拼接后去重在判断长度
  if (new Set(mergeArr).size !== stra.length) return false
  return true
}
// 使用显示
// let a = [1,23,4,5,6,9]
// let b = [1,23,4,5,6,9]
// console.log(isIdentical(a,b));


// 获取本地数据
export const getLS = (name) => {
  return JSON.parse(localStorage.getItem(name));
}
//保存本地数据
export const setLS = (name, data) => {
  localStorage.setItem(name, JSON.stringify(data));
}

// 清除指定属性
// 传入属性数组
export const removeLS = (attr) => {
  localStorage.removeItem(attr);
}

// 随机整数
export const randomNum = (min, max) => {
  return Math.floor(Math.random() * (max - min + 1) + min);
}

// 获取当前数字和前后置顶范围数组的新数组
/**
 * 输入 getArr(7,3)
 * @param {*} num    当前数字
 * @param {*} range   前后范围
 * @returns    [4, 5, 6, 7, 8, 9, 10]
 */
export const getNumRangeArr = (num, range) => {
  let arr = [];
  for (let i = 0; i < range * 2 + 1; i++) {
    if ((num - range + i) > 0) {
      arr.push(num - range + i);
    }
  }
  return arr;
};
// 金额格式
export const toMoney = (value, str) => {
  if (!Number.isFinite(+value)) return ''
  if (!str) str = '';
  // str 规定货币类型
  if (value == "0") return '0.00';
  if (value == ".") return '';
  if (!value) return '';
  let val = Number(value).toFixed(2) // 提前保留两位小数
  let intPart = parseInt(val) // 获取整数部分
  let intPartFormat = intPart.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') // 将整数部分逢三一断 ？？？
  let floatPart = '.00' // 预定义小数部分
  val = val.toString() // 将number类型转为字符串类型，方便操作
  let value2Array = val.split('.')
  if (value2Array.length === 2) { // =2表示数据有小数位
    floatPart = value2Array[1].toString() // 拿到小数部分
    if (floatPart.length === 1) { // 补0,实际上用不着
      return str + intPartFormat + '.' + floatPart + '0'
    } else {
      return str + intPartFormat + '.' + floatPart
    }
  } else {
    return str + intPartFormat + floatPart
  }

}
// 数字金额类型
export const toMoneyNumber = (value) => {
  if (!value) return parseFloat(0).toFixed(2)
  if (!Number.isFinite(+value)) return ''
  return parseFloat(value).toFixed(2)
}
export const formatDateString = (date, formatType = 'YYYY-MM-DD') => {
  const year = date.getFullYear();
  const month = ('0' + (date.getMonth() + 1)).slice(-2);
  const day = ('0' + date.getDate()).slice(-2);
  const hours = ('0' + date.getHours()).slice(-2);
  const minutes = ('0' + date.getMinutes()).slice(-2);
  const seconds = ('0' + date.getSeconds()).slice(-2);
  const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];

  switch (formatType) {
    case 'YYYY-MM-DD':
      return `${year}-${month}-${day}`;
    case 'YYYY-MM-DD HH-MM-SS':
      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
    case 'week':
      return weekdays[date.getDay()];
    case 'HH-MM-SS':
      return `${hours}:${minutes}:${seconds}`;
    default:
      return 'Unsupported format';
  }
}

// 整数
export const integer = (num) => {
  if (!Number.isFinite(+num)) return ''
  const positiveInteger = Math.ceil(num)
  return positiveInteger < 0 ? 0 : positiveInteger
}

// 计算精度方法
//num1 num2传入两个值  symbol +-*/符号
export const amend = (num1, num2, symbol) => {
  var str1 = num1.toString(), str2 = num2.toString(), result, str1Length, str2Length
  //解决整数没有小数点方法
  try { str1Length = str1.split('.')[1].length } catch (error) { str1Length = 0 }
  try { str2Length = str2.split('.')[1].length } catch (error) { str2Length = 0 }
  var step = Math.pow(10, Math.max(str1Length, str2Length))
  switch (symbol) {
    case "+":
      result = (num1 * step + num2 * step) / step
      break;
    case "-":
      result = (num1 * step - num2 * step) / step
      break;
    case "*":
      result = ((num1 * step) * (num2 * step)) / step / step
      break;
    case "/":
      result = (num1 * step) / (num2 * step)
      break;
    default:
      break;
  }
  return result

}


/**
 * 选择文件，处理内容
 * @param {*} e      //文件对象
 * @param {*} handleData    //处理文件内容函数
 * @param {*} fileName     //验证文件包含名称
 */
export const selectFile = (e, handleData, fileName) => {
  let resultFile = e.target.files[0]; //获取文件1信息
  // 如果文件存在
  if (resultFile) {
    // 使用 FileReader 来读取文件
    let reader = new FileReader();
    // 读取纯文本文件,且编码格式为 utf-8
    reader.readAsText(resultFile, 'UTF-8');
    // 读取文件,会触发 onload 异步事件,可使用回调函数 来获取最终的值.
    reader.onload = (e) => {
      let fileContent = e.target.result; //文件文本内容
      //分割换行 转为数组
      const arr = fileContent.split(/[\r\n]+/);
      if (!arr[0].includes(`请勿修改导出文件，避免导入错误，导出${fileName}时间：`)) {
        Message({
          type: "error",
          content: "文件格式不正确",
        })
        return;
      }
      arr.shift(); //删除数组第一个日期
      handleData(arr);
    };
  }
}

/**
 * 导出文件前准备
 * @param {*} LSDataArr    //导出的数据 数组类型
 * @param {*} fileName   //导出的文件名称
 */
export const exportBefore = (LSDataArr, fileName) => {
  // 导出文件内部title标识
  let content =
    `请勿修改导出文件，避免导入错误，导出${fileName}时间：` +
    new Date().toLocaleString();
  LSDataArr.forEach(item => {
    content += '\r\n' + JSON.stringify(item);
  })
  //下载内容，标题加本地数据字符串
  const export_blob = new Blob([content]);
  //创建a标签点击可下载
  const save_link = document.createElement('a');
  save_link.href = window.URL.createObjectURL(export_blob);
  //下载时文件名
  save_link.download = `${fileName}.txt`;
  exportData(save_link);
};

// 导出文件
const exportData = (obj) => {
  const ev = document.createEvent('MouseEvents');
  ev.initMouseEvent(
    'click',
    true,
    false,
    window,
    0,
    0,
    0,
    0,
    0,
    false,
    false,
    false,
    false,
    0,
    null
  );
  obj.dispatchEvent(ev);
};

// 判断当前数字  最靠近数组中那个数字
export function findCloseNum(arr, num) {
  var index = 0; // 保存最接近数值在数组中的索引
  var old_value = Number.MAX_VALUE; // 保存差值绝对值，默认为最大数值
  for (var i = 0; i < arr.length; i++) {
    var new_value = Math.abs(arr[i] - num); // 新差值
    if (new_value <= old_value) { // 如果新差值绝对值小于等于旧差值绝对值，保存新差值绝对值和索引
      if (new_value === old_value && arr[i] < arr[index]) { // 如果数组中两个数值跟目标数值差值一样，取大
        continue;
      }
      index = i;
      old_value = new_value;
    }
  }
  return arr[index] // 返回最接近的数值
}
// 根据宽度 和 范围计算值每一段范围的长度

// 200px 中分为5个范围点  
// w: 范围总总宽度
// r: 范围节点数量 需要加1,保证有末尾点 
// 每个范围间隔40px  return [0,40,80,120,160]
export function handleStepNumber(w, r) {
  const itemPx = w / r;
  let rangArr = [];
  for (let i = 0; i < r + 1; i++) {
    rangArr.push(Math.ceil(itemPx * i));
  }
  return rangArr;
};